package org.redis.cluster.registry;

import java.util.Collection;

import org.redis.cluster.config.ClientConfig;
import org.redis.cluster.config.ServerConfig;

public interface Registry {
	
	/**
	 * 返回服务端路径
	 * @return
	 */
	public String getServerPath();
	
	/**
	 * 返回服务端路径
	 * @param serverConfig
	 * @return
	 */
	public String getServerPath(ServerConfig serverConfig);
	
	/**
	 * 注册服务端
	 * @param serverConfig
	 * @return
	 */
	public boolean registerServer(ServerConfig serverConfig);

	/**
	 * 取消注册服务端
	 * @param serverConfig
	 * @return
	 */
	public boolean unregisterServer(ServerConfig serverConfig);
	
	/**
	 * 服务端
	 * @return
	 */
	public Collection<ServerConfig> getServers();
	
	/**
	 * 监听服务端
	 * @param listener
	 * @return
	 */
	public boolean listenServer(Listener listener);
	
	/**
	 * 返回客户端路径
	 * @return
	 */
	public String getClientPath();
	
	/**
	 * 返回客户端路径
	 * @param clientConfig
	 * @return
	 */
	public String getClientPath(ClientConfig clientConfig);
	
	/**
	 * 注册client
	 * @param clientConfig
	 * @return
	 */
	public boolean registerClient(ClientConfig clientConfig);
	
	/**
	 * 取消注册redis
	 * @param clientConfig
	 * @return
	 */
	public boolean unregisterClient(ClientConfig clientConfig);
	
	/**
	 * 返回redis
	 * @return
	 */
	public Collection<ClientConfig> getClients();
	
	/**
	 * 监听客户端
	 * @param listener
	 * @return
	 */
	public boolean listenClient(Listener listener);
	
	/**
	 * 注册
	 * @param path
	 * @return
	 */
	public boolean register(String path);

	/**
	 * 注册
	 * @param path
	 * @param node
	 * @return
	 */
	public boolean register(String path,Node node);

	/**
	 * 注册
	 * @param path
	 * @param value
	 * @param node
	 * @return
	 */
	public boolean register(String path,Object value,Node node);
	
	/**
	 * 取消注册
	 * @param path
	 * @return
	 */
	public boolean unregister(String path);
	
	/**
	 * 取消注册
	 * @param path
	 * @param value
	 * @return
	 */
	public boolean unregister(String path,Object value);
	
	/**
	 * 设置
	 * @param path
	 * @param node
	 * @return
	 */
	public boolean setNode(String path,Node node);
	
	/**
	 * 设置节点
	 * @param path
	 * @param value
	 * @param node
	 * @return
	 */
	public boolean setNode(String path,Object value,Node node);
	
	/**
	 * 返回节点
	 * @param path
	 * @return
	 */
	public Node getNode(String path);
	
	/**
	 * 返回节点
	 * @param path
	 * @param value
	 * @return
	 */
	public Node getNode(String path,Object value);

	/**
	 * 返回节点
	 * @param path
	 * @param value
	 * @param type
	 * @return
	 */
	public Node getNode(String path,Object value,Class<?> type);
	
	/**
	 * 返回节点
	 * @param path
	 * @param type
	 * @return
	 */
	public Node getNode(String path,Class<?> type);
	
	/**
	 * 返回节点
	 * @param path
	 * @return
	 */
	public Collection<Node> getNodes(String path);
	
	/**
	 * 返回节点
	 * @param path
	 * @param type
	 * @return
	 */
	public Collection<Node> getNodes(String path,Class<?> type);
	
	/**
	 * 返回节点
	 * @param path
	 * @param value
	 * @param type
	 * @return
	 */
	public Collection<Node> getNodes(String path,Object value,Class<?> type);

	/**
	 * 是否存在
	 * @param path
	 * @return
	 */
	public boolean isExist(String path);

	/**
	 * 监听
	 * @param path
	 * @param listener
	 * @return
	 */
	public boolean listen(String path,Listener listener);

	/**
	 * 取消监听
	 * @param path
	 * @param listener
	 * @return
	 */
	public boolean unlisten(String path,Listener listener);
	
	/**
	 * 选择leader
	 * @param path
	 * @param timeout
	 * @param listener
	 * @return
	 */
	public boolean selectLeader(String path,int timeout,Listener listener);
}